Leetcode 23. merge-k-sorted-lists 题解 - Week6
题目链接
Leetcode 23. merge-k-sorted-lists
题目内容
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
Example: Input: [ 1->4->5, 1->3->4, 2->6 ] Output: 1->1->2->3->4->4->5->6
解题思路
这题目跟我们这周上课讲的一道题目一样,都是将k个有序的链表进行合并,刚好验证具体的思路和其代码实现,首先,合并两个List的函数是我们需要实现的,这里我们先完成合并两个链表的函数,这个十分简单,不过为了内存的节省,我没有使用一般的不停新建node的方式,而是通过不断把list2中应该插入的元素插到node1中,没有使用到新的空间。
而总体的思路跟上课说的一致,都是将两两链表分别合并,再两两合并新的链表,直到剩下一个链表,和归并排序的思路类似。这题目的初始状态相当于是归并排序的运行到中间过程的某个状态。整体思路老师上课的时候讲的也很清楚,这里就不多赘述了。
题目代码
class Solution { public ListNode* mergeTwoLists(ListNode* node1, ListNode* node2) { if (node1 == nullptr) return node2; if (node2 == nullptr) return node1; ListNode* n1 = nullptr, *n2 = nullptr, *head = nullptr, *preNode = nullptr; node1->val < node2->val ? (n1 = node1, n2 = node2) : (n1 = node2, n2 = node1); head = n1; while (n1 != nullptr && n2 != nullptr) { if (n1->val <= n2->val) { preNode = n1; n1 = n1->next; } else { auto *nodeTmp = n2->next; n2->next = n1; preNode->next = n2; preNode = n2; n2 = nodeTmp; } } if (n1 == nullptr) preNode->next = n2; return head; } ListNode* mergeKLists(vector<ListNode*>& lists) { if (lists.empty()) return nullptr; for (int i = 0; i < lists.size() - 1; i += 2) { auto *p1 = lists[i], *p2 = lists[i + 1]; lists.emplace_back(mergeTwoLists(p1, p2)); } return lists.back(); } };